//
//  ZYHomeViewController.swift
//  weibo007
//
//  Created by 陈宗毅 on 15/12/15.
//  Copyright © 2015年 czy. All rights reserved.
//

import UIKit
import SVPullToRefresh


enum ZYStatusCellReuseIdentifier:String {
    case StatusNormalCell = "StatusNormalCell"
    case StatusForwardCell = "StatusForwardCell"
}

// tableView cell 的高度想通过cell里面的内容来自适应
// 1.需要给contentView添加约束,让contentView的高度参照里面的内容来自动更改高度(需要添加顶部和底部约束)
// 2.设置cell预估行高
// 3.设置cell行高根据约束来自适应
class ZYHomeViewController: ZYBaseViewController {

    // MARK: - 属性
    ///微博数据
    var statuses:[ZYStatus]?{
        didSet{
        self.tableView.reloadData()
        }
    }
    
//   private let ReuserIndentifiler = "ReuserIndentifiler"
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //没有登录不做以下操作
        if !ZYUserAccount.userLogin{
            return
        }
        //设置导航栏
        setupNav()
        
        prepareTableView()
        
//        loadStatus()
        
        // tableView自带一个刷新控件
        // UIRefreshControl继承自UIControl,1.可以往里面添加控件 2.addTarget
        // 默认的宽度为屏幕的宽度,高度60. frame = (0 0; 375 60)
        refreshControl = ZYRefreshControl()
        //刷新控件监听下拉事件
        refreshControl?.addTarget(self, action: "loadNewStatus", forControlEvents: UIControlEvents.ValueChanged)
        // 主动进入刷新状态,只会让刷新控件界面显示刷新,并不会主动触发 UIControlEvents.ValueChanged 事件
        refreshControl?.beginRefreshing()
        
        // 主动触发 UIControlEvents.ValueChanged
        refreshControl?.sendActionsForControlEvents(UIControlEvents.ValueChanged)

    }
    
    func loadNewStatus(){
        
        let since_id = statuses?.first?.id ?? 0
        let max_id = 0
    
        ZYStatus.mLoadStatus(since_id, max_id: max_id) { (statuses, error) -> () in
           
            //关闭刷新控件（结束刷新）
            self.refreshControl?.endRefreshing()
            
            if error != nil{
                print("加载微博数据错误:\(error)")
                return
            }
            
            let count = statuses?.count ?? 0
            if count == 0 {
                print("没有加载到数据")
                return
            }
            
            if since_id > 0 {
                self.statuses = statuses! + self.statuses!
                print("下拉刷新 加载到\(count)条新数据")
            }else {
                self.statuses = statuses
                print("第一次进入程序，加载了 \(count)条微博数据")
                self.tableView.showsInfiniteScrolling = true
            }
            print("总共有多少条数据：\(self.statuses?.count)")
        }
        
    }
    
    func loadMoreStatus(){
        let since_id = 0
        let max_id = statuses?.last?.id ?? 0
        
        ZYStatus.mLoadStatus(since_id, max_id: max_id) { (statuses, error) -> () in
            //关机上拉加载更多数据的控件
            self.tableView.infiniteScrollingView.stopAnimating()
            
        }
    }
    
    private func prepareTableView(){
        
        tableView.registerClass(ZYStatusNormalCell.self, forCellReuseIdentifier: ZYStatusCellReuseIdentifier.StatusNormalCell.rawValue)
        //注册转发的cell
        tableView.registerClass(ZYStatusForwardCell.self, forCellReuseIdentifier: ZYStatusCellReuseIdentifier.StatusForwardCell.rawValue)
        
        //        tableView.rowHeight = 100
        //设置cell的预估行高
        tableView.estimatedRowHeight = 200
        //设置cell高度 根据高度来自适应
        //        tableView.rowHeight = UITableViewAutomaticDimension
        
        //去除cell的分割线
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        //不要在控制器里面来字典转模型
        //        ZYNetworkTool.shareInstance.loadStatus { (result, error) -> () in
        //            print("result:\(result)")
        //        }
        //调用模型来加载微博数据(微博模型)
    }
    
    private func setupNav(){
        //左边的按钮
        navigationItem.leftBarButtonItem = UIBarButtonItem(imageName: "navigationbar_friendsearch")
        navigationItem.rightBarButtonItem = UIBarButtonItem(imageName: "navigationbar_pop")
        
        let title = ZYUserAccount.loadUserAccount()?.screen_name ?? "没有获取到用户名"
        
      let titleButton =   ZYHomeTitleView(imageName: "navigationbar_arrow_down", title: title)
        
        titleButton.addTarget(self, action: "homeTitleButtonClick:", forControlEvents: UIControlEvents.TouchUpInside)
        navigationItem.titleView = titleButton
    }
    /// 标题按钮点击事件
    func homeTitleButtonClick(button:UIButton) {
        button.selected = !button.selected
        //UIVIew动画旋转
            //1. 就近原则
            //2.两边一样远会顺时针旋转
     
        UIView.animateWithDuration(0.25) { () -> Void in
            button.imageView?.transform = button.selected ? CGAffineTransformMakeRotation(CGFloat(M_PI) - 0.001) :
           CGAffineTransformIdentity
        }
        
    }
    
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
//        print("heightForRowAtIndexPath:\(indexPath)")
        // 根据不同的模型,计算出cell的高度
        // 1.获取模型
        let status = self.statuses![indexPath.row]
        // 2.查看模型是否有缓存的行高,如果有缓存的行高直接返回
        if status.rowHeight != nil {
            //有缓存的行高
//            print("返回缓存的行高：\(status.rowHeight)")
            return status.rowHeight!
        }
        
        //没有缓存行高
        // 3.获取cell(需要根据不同的模型,获取对应的cell),使用不带IndexPath方法
        let cellID = status.cellID()
        
        let cell = tableView.dequeueReusableCellWithIdentifier(cellID) as! ZYStatusCell
        
        let rowHeight = cell.rowHeight(status)
        //保存计算好的行高
        status.rowHeight = rowHeight
//        print("计算行高 rowHeight:\(rowHeight)")
        
        return rowHeight
    }
    
   
    
    //MARK: - tableView
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        //如果没有statuses ,返回0
        return statuses?.count ?? 0
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        //取出对应的模型
        let status = statuses![indexPath.row]
        let cellID = status.cellID()
        let cell = tableView.dequeueReusableCellWithIdentifier(cellID) as! ZYStatusCell

        cell.status = status
        
        return cell
    }

}
